package com.example.usercenter.service.impl;

import com.alipay.api.domain.UserVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.usercenter.common.ErrorCode;
import com.example.usercenter.exception.ServiceException;
import com.example.usercenter.model.domain.Tag;
import com.example.usercenter.model.domain.User;
import com.example.usercenter.model.request.TagCreateRequest;
import com.example.usercenter.model.vo.RootTagVO;
import com.example.usercenter.model.vo.TagVO;
import com.example.usercenter.model.vo.UserVO;
import com.example.usercenter.service.TagService;
import com.example.usercenter.mapper.TagMapper;
import com.example.usercenter.service.UserService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.Session;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* @author 57017
* @description 针对表【t_tag(标签表)】的数据库操作Service实现
* @createDate 2024-05-05 14:38:05
*/
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag>
    implements TagService {

    @Resource
    private UserService userService;

    @Override
    public Long createTag(TagCreateRequest tagCreateRequest, HttpSession session) {
        // TODO：这里需要加上权限校验
        // 1. 校验请求用户是否为登录态
//        User loginUser = userService.getLoginUser(session);
//        if (loginUser == null) {
//            throw new ServiceException(ErrorCode.NO_LOGIN);
//        }
//        // 2. 校验用户是否为管理员
//        boolean admin = userService.isAdmin(session);
//        if (!admin) {
//            throw new ServiceException(ErrorCode.NO_AUTH);
//        }
        // 3. 校验标签名称长度
        String tagName = tagCreateRequest.getTagName();
        if (StringUtils.isBlank(tagName) || tagName.length() > 10) {
            throw new ServiceException(500, "标签长度不合法！");
        }
        // 4. 校验父级标签合法性
        Integer isParent = tagCreateRequest.getIsParent();
        if (ObjectUtils.isEmpty(isParent)) {
            throw new ServiceException(ErrorCode.PARAMS_ERROR);
        }
        // 5. 校验parentId
        Long parentId = tagCreateRequest.getParentId();
        if (isParent.equals(0)) {
            // 不是父级标签但是父标签不存在
            if (ObjectUtils.isEmpty(parentId) || parentId <= 0) {
                throw new ServiceException(ErrorCode.PARAMS_ERROR);
            }
            Tag parentTag = this.getById(parentId);
            if (parentTag == null) {
                throw new ServiceException(500, "父级标签不存在！");
            }
        } else {
            // 是父级标签但是父标签不为null
            if (!ObjectUtils.isEmpty(parentId)) {
                throw new ServiceException(ErrorCode.PARAMS_ERROR);
            }
        }
        // 6. 新增标签记录到数据库
        Tag tag = new Tag();
        BeanUtils.copyProperties(tagCreateRequest, tag);
        tag.setUploadUserId(1L); // TODO：这里需要改成loginUser.getId();
        boolean saveRes = this.save(tag);
        if (!saveRes) {
            throw new ServiceException(500, "新增标签失败！");
        }
        return tag.getId();
    }

    @Override
    public List<TagVO> getAllTags(HttpSession session) {
        // TODO：前端应该传送cookie字段（未解决）
//        // 1. 校验用户登录态
//        User loginUser = userService.getLoginUser(session);
//        if (loginUser == null) {
//            throw new ServiceException(ErrorCode.NO_LOGIN);
//        }
//        // 2. 校验用户管理员身份
//        boolean admin = userService.isAdmin(session);
//        if (!admin) {
//            throw new ServiceException(ErrorCode.NO_AUTH);
//        }
        // 3. 查询全部标签返回
        List<Tag> srcTags = this.list();
        List<TagVO> retTagList = new ArrayList<>();
        for (Tag tag : srcTags) {
            TagVO tagVO = new TagVO();
            BeanUtils.copyProperties(tag, tagVO);
            // 3.1 关联查询parentTag
            if (tag.getParentId() != null) {
                Tag parentTag = this.getById(tag.getParentId());
                TagVO parentTagVO = new TagVO();
                BeanUtils.copyProperties(parentTag, parentTagVO);
                tagVO.setParentTag(parentTagVO);
            }
            // 3.2 关联查询uploadUser
            User uploadUser = userService.getById(tag.getUploadUserId());
            UserVO uploadUserVO = new UserVO();
            BeanUtils.copyProperties(uploadUser, uploadUserVO);
            tagVO.setUploadUser(uploadUserVO);
            retTagList.add(tagVO);
        }
        return retTagList;
    }

    @Override
    public List<RootTagVO> getAllTagsByGroup(HttpSession session) {
        // 1. 查询全部父级标签
        List<RootTagVO> parentTagList = getParentTagList();
        // 2. 查询出父级标签下全部子级标签
        for (RootTagVO rootTagVO : parentTagList) {
            long rootTagVOId = rootTagVO.getId();
            rootTagVO.setChildren(getChildrenTag(rootTagVOId));
        }
        // 3. 返回层次标签
        return parentTagList;
    }

    @Override
    public List<TagVO> getChildrenTags(HttpSession session) {
        // TODO；进行权限校验
        // 1. 定义查询条件
        QueryWrapper<Tag> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_parent", 0);
        // 2. 进行查询
        List<Tag> childrenTagList = this.list(queryWrapper);
        // 3. 封装成VO
        List<TagVO> childrenTagVOList = new ArrayList<>();
        for (Tag childTag : childrenTagList) {
            TagVO childTagVO = new TagVO();
            BeanUtils.copyProperties(childTag, childTagVO);
            childrenTagVOList.add(childTagVO);
        }
        return childrenTagVOList;
    }

    /**
     * 获取全部的父级标签
     * @return 全部的父级标签
     */
    private List<RootTagVO> getParentTagList() {
        // 定义查询条件
        QueryWrapper<Tag> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_parent", 1);
        // 查询全部父级标签
        List<Tag> tagList = this.list(queryWrapper);
        List<RootTagVO> rootTagVOList = new ArrayList<>();
        // 封装VO响应对象
        for (Tag tag : tagList) {
            RootTagVO rootTagVO = new RootTagVO();
            BeanUtils.copyProperties(tag, rootTagVO);
            rootTagVOList.add(rootTagVO);
        }
        return rootTagVOList;
    }


    /**
     * 查询指定父级标签id的全部子级标签
     * @param parentTagId 父级标签id
     * @return 子集标签列表
     */
    private List<TagVO> getChildrenTag(long parentTagId) {
        // 父级标签不存在
        if (parentTagId <= 0) {
            return new ArrayList<>();
        }
        // 定义查询条件
        QueryWrapper<Tag> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentTagId);
        // 进行查询
        List<Tag> childrenTagList = this.list(queryWrapper);
        // 封装成VO对象返回
        List<TagVO> childrenTagVOList = new ArrayList<>();
        for (Tag tag : childrenTagList) {
            TagVO tagVO = new TagVO();
            BeanUtils.copyProperties(tag, tagVO);
            childrenTagVOList.add(tagVO);
        }
        return childrenTagVOList;
    }


}





